Python(爬虫篇)

您所在的位置:网站首页 python jsencrypt解密 Python(爬虫篇)

Python(爬虫篇)

2024-07-17 12:41| 来源: 网络整理| 查看: 265

文章目录 一、简介JS加密的分析步骤: 二、案例:有道翻译步骤一:常规操作。找到url,简单分析步骤二:更改参数为变量,找到参数变化规律步骤三:(关键一步)使用Python代码生成sign

一、简介

“加密”的过程,就是把“明文”变成“密文”的过程。反之:“解密”的过程,就是把“密文” 变为“明文”。网页数据加密的方式有很多种,比如:JS 加密、Base64 加密、CSS 加密等。

下面让我们一起来探讨一下JS加密!并借助于案例感受解密思维逻辑。

JS加密:是一个非常常见的加密,大部分的页面都会存在

JS加密一般都是对参数进行加密(比如:salt、sign、token、signature等)

JS加密的分析步骤: 找到哪些参数在影响数据的获取? 需要做不同的请求,对比参数,找出不同的参数即可找到参数之后,需要查找这些参数从哪里获得的/生成的原理是什么? (1) 这些参数可能是通过之前的一些请求传递过来的 (2) 参数是在某个JS文件中生成的 —> 找出对应的JS文件,分析JS代码,得到参数生成的原理 二、案例:有道翻译

需求:用户输入,得到翻译

步骤一:常规操作。找到url,简单分析

在这里插入图片描述

在这里插入图片描述 代码:

import time,random import requests,hashlib # 定义请求头 headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Length': '236', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': '[email protected]; JSESSIONID=aaaLdHZ6LoWe0bYE2Fiyx; OUTFOX_SEARCH_USER_ID_NCOO=1300305255.7828863; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1606460419940', 'Host': 'fanyi.youdao.com', 'Origin': 'http://fanyi.youdao.com', 'Referer': 'http://fanyi.youdao.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', } # 自定义输入单词 word = input('请输入想要查询的单词:') # 定义参数字典 data = { 'i': as, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': '16068273407898', 'sign': 'c33d66c41999155f58283feceaf151dd', 'lts': '1606827340789', 'bv': '1dfc4dfa8627abec379e26d41735b09a', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME', } # 发起请求,接收响应 response = requests.post(url='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule',headers=headers,data=data) print(response.json()['translateResult'][0][0]['tgt'])

发现问题: 单词只能查询as,其余单词的都不行 在这里插入图片描述 在这里插入图片描述 分析问题:可能是参数不同,到页面上查看其它单词的参数。 分析得到: 在这里插入图片描述 不同单词有不同的参数:

i:输入的单词salt:可能是时间戳sign:看不懂lts:可能是时间戳,但比salt少一位 步骤二:更改参数为变量,找到参数变化规律

此时判定为使用了JS加密,故去网页中的JS文件查找 在这里插入图片描述 通过开发者工具的Initiator可以发现,当前文件仅仅使用了一个JS文件,所以我们要找的参数就在其中。点击查看js文件

通过查找,发现sign所在的位置及代码 在这里插入图片描述 如何确定这个sign就是我们需要的? 在这一行打上断点,刷新页面重新请求,如进入debug模式则为目标参数 在这里插入图片描述

找到目标参数,分析代码

var r = function(e) { var t = n.md5(navigator.appVersion) , r = "" + (new Date).getTime() , i = r + parseInt(10 * Math.random(), 10); return { ts: r, bv: t, salt: i, sign: n.md5("fanyideskweb" + e + i + "]BjuETDhU)zqSxf-=B#7m") } };

分析结果: sign是经过md5加密后的值,加密参数有e,i两个 其中e可以发现是我们输入的单词 i也就是salt,是由r一级一位随机数组成,其中的r是时间戳。

步骤三:(关键一步)使用Python代码生成sign salt = str(int(round(time.time()*1000))) + str(random.randint(0,9)) # 获取sign def get_sign(sign): # 1. 初始化md5 md5 = hashlib.md5() # 2. 加密 md5.update(sign.encode('utf-8')) # 3. 返回加密数据 return md5.hexdigest() sign = get_sign("fanyideskweb" + word + salt + "]BjuETDhU)zqSxf-=B#7m")

步骤四:更改参数字典,完成需求

# 定义参数字典 data = { 'i': word, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt, 'sign': sign, 'lts': str(int(round(time.time()*1000))), 'bv': '1dfc4dfa8627abec379e26d41735b09a', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME', }


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3